package com.cskaoyan.javase.oop2._1extends._7initialization._5review;
/**
 * 子类对象的初始化,"先父后子"
 * 类加载的先父后子:
 *      指的是类初始化的先父后子,表现在JVM内存中
 *      是父类的clinit方法先进栈,子类的clinit方法栈帧后进栈
 *      并且是执行完父类的clinit方法,然后再执行子类的clinit方法
 *
 * 成员变量赋值的先父后子: 是构造器代码执行的先父后子
 *      但从具体方法调用上来说,是子类的init构造方法先被调用,先进栈,但虽然先调用
 *      但子类构造器的代码,包括子类成员变量的显式赋值,构造代码块都不会执行
 *      而会因为子类构造器的第一行隐含super(),或者直接super(实参)调用父类构造器
 *      这时直接去调用父类的构造器,父类构造器的方法栈帧进栈
 *      随后先执行父类成员变量的赋值手段
 *      最后才轮得到子类
 *
 * @since 14:21
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new Son();
    }
}
class Father{
    static {
        System.out.println("father");
    }

    public Father() {
    }
}
class Son extends Father{
    static {
        System.out.println("son");
    }

    public Son() {
        // super();
    }
}